package com.learn;

import java.util.Arrays;

public class num_189 {
    /**
     * 给你一个数组，将数组中的元素向右轮转 k 个位置，其中 k 是非负数。
     * 输入: nums = [1,2,3,4,5,6,7], k = 3
     * 输出: [5,6,7,1,2,3,4]
     * 解释:
     * 向右轮转 1 步: [7,1,2,3,4,5,6]
     * 向右轮转 2 步: [6,7,1,2,3,4,5]
     * 向右轮转 3 步: [5,6,7,1,2,3,4]
     */
    //[1,2,1,2,1,2]--3->[2,1]
    public static void rotateMyself(int[] nums, int k) {
        //如果k等于nums.length，那么，整个数组进行翻转
        //所谓翻转，其实就是将nums后k位，放置到nums的前k位中
        //没有返回类型，意味着是在nums中进行的
        //能否复制数组？如果k=3，
        //可见，我们应该从后面的第一位开始，向前-k
        //[1,2,3,4,5,6,7,1,2,3,4,5,6,7]？
        if (nums.length < 2) {
            return;
        }
        int[] doubleArr = new int[nums.length * 2];
        int loc = nums.length;
        System.arraycopy(nums, 0, doubleArr, 0, loc);
        System.arraycopy(nums, 0, doubleArr, loc, loc);

        if (loc < k) {
            k=k%loc;
        }
        doubleArr = Arrays.copyOfRange(doubleArr, loc - k,
                loc - k + loc);

        for (int i = 0; i < doubleArr.length; i++) {
            nums[i] = doubleArr[i];
        }
    }

    public static void rotate(int[] nums, int k) {
        //为了防止越界异常，先缩短k的长度
        k %= nums.length;
        //先进行整体的翻转
        reverse(nums, 0, nums.length - 1);
        //在进行尾部和前部的翻转
        reverse(nums, 0, k - 1);
        reverse(nums, k, nums.length - 1);
    }

    public static void reverse(int[] nums, int start, int end) {
        //直接对数组进行翻转，指定位置进行翻转
        while (start < end) {
            int temp = nums[start];
            nums[start] = nums[end];
            nums[end] = temp;
            start += 1;
            end -= 1;
        }
    }
    public static void main(String[] args) {
        int[] arr = {1,2,3,4,5,6,7};
//        int[] arr = {1, 2};
//        int[] arr1 = {-1,-100,3,99};
        rotate(arr, 3);
        System.out.println(Arrays.toString(arr));
    }

}

